热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

技能速成|一文带你学会MybatisPlus

一.MP简介我们知道,Mybatis属于一个半自动的ORM框架。之所以说Mybatis是一个半自动的ORM框架,原因是它还需要我们自己在注解或是映射文
一. MP简介

我们知道,Mybatis属于一个半自动的ORM框架。之所以说Mybatis是一个半自动的ORM框架,原因是它还需要我们自己在注解或是映射文件中编写SQL语句,并没有实现完全的自动化。SQL语句的编写,虽然增加了项目和业务需求实现的灵活性,但对一些基本表的操作而言,无疑增加了数据库操作的复杂度,显得没有那么方便。

而Mybatis-Plus则是全自动的ORM框架,按照开闭原则,在不影响Mybatis现有功能的情况下,实现了对Mybatis的功能增强。如果你之前有过Mybatis的使用经验,现在学习Mybatis-Plus简直就是手到擒来。

 今天壹哥就带大家来学习一下Mybatis-Plus框架的基本使用,请掏出小本本吧。

二. Mybatis-Plus特点

MP具有如下基本特点:

  1. 通过在实体类中与数据库表进行映射;

  2. 无需编写SQL语句,简化了CRUD操作;

  3. 通常适用于单表。



三. MP使用

接下来壹哥会在SpringBoot项目环境中,带着大家一起使用Mybatis-Plus。

1. 新建SpringBoot项目

创建SpringBoot项目的过程,壹哥在这里就给大家省略了,如果有不熟悉的同学,可以参考壹哥之前关于SpringBoot的教程文章,链接如下:

SpringBoot2.x系列教程汇总-从入门到精通

2. 添加核心依赖

我们在SpringBoot项目中添加需要用到的核心依赖包。

org.springframework.bootspring-boot-starter-webmysqlmysql-connector-java5.1.47com.baomidoumybatis-plus-boot-starter3.3.1.tmpcom.alibabadruid1.2.8org.projectlomboklomboktrue1.18.4junitjunit4.12org.slf4jslf4j-log4j121.6.4

在这里面比较重要的依赖包,就是今天我们要使用的mybatis-plus-boot-starter这个依赖了。

3. 创建SpringBoot启动程序

和其他SpringBoot项目的启动程序一样,此处也略过。

4. 配置文件

在配置文件中,我们主要编写的是数据库的连接信息,壹哥在这里使用的是properties格式的配置文件,也就是application.properties。当然大家也可以使用yml文件格式。

spring.datasource.password=数据库账号的登录密码
spring.datasource.username=数据库登录账号
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
server.port=8096
spring.application.name=MYBATISPLUSSERVER

 5. 编写实体类

由于mybatis-plus,可以不编写SQL语句。那么Java中的对象,到底该如何与数据库中的表进行映射呢?答案其实就在实体类中!我们可以通过不同的注解来完成实体类和具体表,以及实体类的属性和表中的列进行映射。这也是mybatis-plus中非常关键的一步,具体实现如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("emp") //告知mybatis-plus和数据库中的哪个表关联
public class User extends Model implements Serializable {//主键idprivate int id; //当实体类的属性名和和表中的列名相同,无需做任何设置@TableField("name") private String userName; //属性名和列名不一致时设置映射,用userName属性和表中的name列进行关联private int age;private String email;
}

6. 编写dao接口

我们这里的接口中,不必编写任何CRUD方法,只需要继承BaseMapper接口即可。通过阅读源码我们可以发现,在这个接口中其实已经封装了常见的CURD方法,源码如下:

所以,实体类中就可以省去CRUD方法的代码实现。

package com.qf.pro.dao;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qf.pro.pojo.User;public interface UserDao extends BaseMapper {//BaseMapper 默认封装了CRUD方法,通过泛型制定了所操作的实体类及表
}

7. 编写配置类

这样当SpringBoot启动时,就可以扫描到dao层代码所在的包。

package com.qf.mp2103.dao;import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@MapperScan("com.qf.mp2103.dao")
public class MybatisPlusConfig {@Beanpublic PaginationInterceptor paginationInterceptor(){return new PaginationInterceptor();}
}

8. 业务实现

我们要在业务逻辑层里调用各种CRUD方法,这也是Mybatis-Plus比较核心、重要的点,MybatisPlus会根据之前的配置自动生成SQL语句。

package com.qf.mp2103.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qf.mp2103.dao.UsersDao;
import com.qf.mp2103.pojo.Users;
import com.qf.mp2103.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.HashMap;
import java.util.List;
import java.util.Map;@Service
public class UserServiceImpl implements UsersService {&#64;Autowiredprivate UsersDao usersDao;&#64;Overridepublic List findUsers() {//mybatisplus 自动生成/提供的查询方法//由于是无条件查询&#xff0c;参数nullreturn usersDao.selectList(null);}&#64;Overridepublic List findUsersByCondition(String name) {//创建QueryWrapper对象QueryWrapper wrapper&#61;new QueryWrapper();//通过wrapper对象来设置查询条件//参数1&#xff1a;字段表名//参数2&#xff1a;所赋值//eq 等于wrapper.eq("name",name);return usersDao.selectList(wrapper);}&#64;Overridepublic List findUsersByCondition2(int startAge, int endAge) {QueryWrapper wrapper&#61;new QueryWrapper();//年龄的范围wrapper.between("age",startAge,endAge);return usersDao.selectList(wrapper);}&#64;Overridepublic List findUsersByCondition3(Users users) {//多条件查询QueryWrapper wrapper&#61;new QueryWrapper();//where name&#61;&#39;&#39; and age <&#61;
// wrapper.eq(true,"name",users.getUserName());wrapper.le(true,"age",users.getAge());//where name&#61;&#39;&#39; or age >&#61;wrapper.eq(true,"name",users.getUserName());wrapper.ge(false,"age",users.getAge());return usersDao.selectList(wrapper);}&#64;Overridepublic List findUsersByCondition4(Users users) {//模糊查询QueryWrapper wrapper&#61;new QueryWrapper();//%关键字%wrapper.like("name",users.getUserName());//%明//wrapper.likeLeft()//李%//wrapper.likeRight();return usersDao.selectList(wrapper);}//排序查询&#64;Overridepublic List findUsers2() {QueryWrapper wrapper&#61;new QueryWrapper();//设置排序条件wrapper.orderByDesc("id");return usersDao.selectList(wrapper);}&#64;Overridepublic List findUsersByPage(int page, int size) {//用于分页查询//select * from users limit X,XQueryWrapper wrapper&#61;new QueryWrapper();int start&#61;(page-1)*size;//拼接wrapper.last("limit "&#43;start&#43;","&#43;size);return usersDao.selectList(wrapper);}&#64;Overridepublic List findUsers3() {//查询指定列QueryWrapper wrapper&#61;new QueryWrapper();//设置查询的列wrapper.select("id","email");return usersDao.selectList(wrapper);}&#64;Overridepublic boolean addUser(Users users) {//添加用户int result&#61;usersDao.insert(users);return result&#61;&#61;1;}&#64;Overridepublic boolean deleteUser(int id) {//删除用户--单个删除int result&#61;usersDao.deleteById(id);//批量删除//usersDao.deleteBatchIds(List list);return result&#61;&#61;1;}&#64;Overridepublic boolean updateUser(Users users) {//要求表中的主键列是id的名字&#xff0c;使用id列作为条件int result&#61;usersDao.updateById(users);//如果主键列的名字不是id,或者条件不是主键id
// QueryWrapper wrapper&#61;new QueryWrapper();
// wrapper.eq("email",users.getEmail());
// int result2&#61;usersDao.update(users,wrapper);return result&#61;&#61;1;}&#64;Overridepublic Users findUersById(int id) {//根据主键id查询单个对象return usersDao.selectById(id);}&#64;Overridepublic List findUsersByIds(List list) {//根据id批量查询return usersDao.selectBatchIds(list);}&#64;Overridepublic Map findUsersByPage2(int page, int size) {//如果还有其他条件查询&#xff0c;声明条件构造器进行//创建分页插件对象//参数1&#xff1a;显示第几页数据//参数2&#xff1a;每页显示几条数据Page page1&#61;new Page(page,size);//根据分页插件对象里的分页条件查询数据IPage iPage&#61;usersDao.selectPage(page1,null);Map map&#61;new HashMap();//获取总记录数 iPage.getTotal()map.put("totalCount",iPage.getTotal());//获取总页数 iPage.getPages()map.put("totalPage",iPage.getPages());//获取分页数据map.put("data",iPage.getRecords());return map;}&#64;Overridepublic List findUsers4(int age1, int age2, String email) {QueryWrapper queryWrapper&#61;new QueryWrapper();queryWrapper.ge("age",age1).le("age",age2).or().likeRight("email",email);return usersDao.selectList(queryWrapper);}&#64;Overridepublic Users findUsers5(int id) {//创建实体类对象Users user&#61;new Users();user.setId(id);//声明对象接收查询返回的结果Users getUser&#61;user.selectById(id);return getUser;}&#64;Overridepublic void addUsers2(Users users) {//添加方法users.insert();}&#64;Overridepublic void updateUsers2(Users users) {//根据主键更新users.updateById();}&#64;Overridepublic void deleteUsers2(Users users) {//根据主键删除users.deleteById();}public Users findOne(String name){//根据其他条件查询单个数据&#xff0c;如果多于1条数据&#xff0c;则报异常//条件构造器QueryWrapper queryWrapper&#61;new QueryWrapper();queryWrapper.eq("name",name);return usersDao.selectOne(queryWrapper);}//查询总记录数public int getUserCount(){//可以声明条件构造器return usersDao.selectCount(null);}}

这样通过以上几个步骤&#xff0c;我们就学会了Mybatis-Plus的基本使用&#xff0c;希望今天的文章可以教会大家如何使用Mybatis-Plus。如果你还有疑惑&#xff0c;可以私信我们哦。


推荐阅读
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了如何使用PHP代码将表格导出为UTF8格式的Excel文件。首先,需要连接到数据库并获取表格的列名。然后,设置文件名和文件指针,并将内容写入文件。最后,设置响应头部,将文件作为附件下载。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 基于SSL的mysql服务器的主从架构实现说明:本文选用172.16.22.1作为主服务器,172.16.22.3作为从服务器从服务器的mysql软件版 ... [详细]
  • 1.使用通用mapper时实体类的mapper接口(即普通的dao接口)继承了通用mapper接口后,在依赖注入实体类的mapper接口时 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文总结了解决python文件读写乱码问题的方法。其中包括错误的打开方式和正确的打开方式,并提供了相应的代码示例。建议在进行写入操作后先将文件关闭,然后再打开,最后再读取文件。若文件编码是utf-8,则需要在读取文件时添加decode('utf-8')。这样操作可以避免在打开记事本时出现乱码问题。 ... [详细]
  • OAuth2.0指南
    引言OAuth2.0是一种应用之间彼此访问数据的开源授权协议。比如,一个游戏应用可以访问Facebook的用户数据,或者一个基于地理的应用可以访问Foursquare的用户数据等。 ... [详细]
author-avatar
jfgkj6454_478
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有